home *** CD-ROM | disk | FTP | other *** search
- /*
- dshell v3
-
- 印刷周り関係
- */
-
- #include "dsh.h"
-
-
- static void prn_one_lin(int, FILE *);
- static void d_print2(int, int, int, int);
- static void hcopy(void);
-
-
-
- void
- d_print()
- {
- FILE *fp;
- int i;
-
- if (printer_init()) {
- #ifdef DEBUG
- fp = fopen("xcon", "w");
- if (fp == NULL) {
- return;
- }
- #else
- fp = stdprn; //fp = fopen("prn", "w");
- #endif
- w_open();
- w_mes(1, "プリンタへ出力中です");
- w_mes(2, "[ESC]:印刷中止");
- i = 0;
- while (1) {
- if (esc_on()) {
- clr_kbf();
- break;
- }
- clr_kbf();
- prn_one_lin(i, fp);
- ++i;
- if (i >= lpmx) {
- break;
- }
- }
- w_close();
- #ifdef DEBUG
- fclose(fp);
- #endif
- } else {
- w_open();
- w_mes(0, "プリンタへの出力ができません!");
- w_wait(0);
- w_close();
- }
- wait_mb_off();
- }
-
- /*
- たれ流し(?)プリントアウト
- */
- static void
- prn_one_lin(int lin, FILE *fp)
- {
- int in, n;
- uchar buf[256], *p;
-
- strcpy(buf, lhp[lin]);
- if (buf[0] == CTRL_CHAR) {
- if ((buf[1] | 0x20) == VEXEC_CHAR) {
- buf[0] = (uchar)(L'◎' >> 8);
- buf[1] = (uchar)(L'◎');
- } else if (buf[1] == HR_CHAR) {
- strcpy(buf, buf + 2);
- }
- }
- if (buf[0] == NORM_CHAR)
- strcpy(buf, buf + 1);
- for (p = buf; in = dinstrchr(p, '\x1b');) { // ^[
- p += in;
- n = isEscSeq(p);
- if (n > 0 && p[n - 1] == 'C') {
- uchar buf2[256];
- strcpy(buf2, p + n);
- sprintf(p - 1, "%*s%s", atoi(p + 1), "", buf2);
- p--;
- } else if (n > 0 && p[n - 1] == 'D') {
- uchar buf2[256];
- strcpy(buf2, p + n);
- p--;
- while (--n >= 0)
- *p++ = '\b';
- strcpy(p, buf2);
- } else {
- strcpy(p - 1, p + n);
- p--;
- }
- }
- for (p = buf; in = dinstrchr(p, CTRL_CHAR);) { // %V%W, %CUT, TYPE=
- p += in - 1;
- switch (*(p + 1)) {
- case LARGE_CHAR:
- strcpy(p, p + 4); // %V%W の内部表現は4バイト
- p += dinstrchr(p, '\x18') - 1;
- strcpy(p, p + 1);
- break;
- case SMALL_CHAR:
- strcpy(p, p + 2); // %v%w の内部表現は2バイト
- p += dinstrchr(p, '\x18') - 1;
- strcpy(p, p + 1);
- break;
- case CUT_CHAR:
- *p++ = '%';
- *p++ = 'C';
- *p++ = 'U';
- *p++ = 'T';
- strcpy(p, p + 6 - 4); // %CUT の内部表現は6バイト
- break;
- case BOX_CHAR:
- *p++ = *(p + 4); // 桁合わせが面倒なので左端だけ
- *p++ = *(p + 5 - 1);
- strcpy(p, p + 9 - 2); // %box の内部表現は9バイト
- break;
- case FONT_CHAR:
- {
- uchar *q;
- for (q = p; *q++ != NORM_CHAR;)
- ;
- strcpy(p, q);
- }
- break;
- case TYPE_CHAR:
- strcpy(p, p + 1);
- strcat(p, ">");
- break;
- case NULTYPE_CHAR:
- *p++ = '(';
- strcpy(p, p + 1);
- strcat(p, ")");
- break;
- case EFONT_CHAR:
- default:
- strcpy(p, p + 1);
- break;
- }
- }
- for (p = buf; in = dinstrchr(p, '\x18');) { // ^X
- p += in - 1;
- strcpy(p, p + 1);
- }
- for (p = buf; in = dinstrchr(p, '\f');) {
- p += in - 1;
- *p++ = ' ';
- }
-
- fprintf(fp, "%s\n", buf);
- }
-
-
-
- struct menuitem {
- int ox;
- int oy;
- char *item;
- };
- static int HCSIZE;
- static int H_size = 0;
- static int Gamen = 4;
- static int Iti = 8;
- static int Koukan = 10;
-
- int PM_X;
- int PM_Y;
-
- static void
- item_rev(const struct menuitem items[], int old, int new)
- {
- B_COLOR(3);
- B_LOCATE(PM_X + items[old].ox, PM_Y + items[old].oy);
- B_PRINT(items[old].item);
- B_COLOR(9);
- B_LOCATE(PM_X + items[new].ox, PM_Y + items[new].oy);
- B_PRINT(items[new].item);
- B_COLOR(3);
- }
-
- /*
- menu_sx:[印刷]メニューのX始桁
- */
- void
- prn_menu(int menu_sx)
- {
- static const struct menuitem items[]=
- {
- 17, 5, "縮小コピー",
- 29, 5, "拡大コピー",
- 17, 7, "1",
- 21, 7, "2",
- 25, 7, "3",
- 29, 7, "4",
- 33, 7, "5",
- 37, 7, "全部",
- 17, 9, "先頭から",
- 27, 9, "今表示されている位置から",
- 17, 11, "手で交換",
- 27, 11, "連続打ち",
- 37, 11, "FFを挿入して連続打ち",
- 17, 13, "印刷実行",
- 35, 13, "キャンセル",
- 0, 0, ""
- };
-
- int old = 0;
- int rtn;
- int dmx, dmy, bl, br;
- int px, py, i, cansel = FALSE;
- int end_sw = 1;
-
- /* pcm8+zmusic(v2.00未満)が常駐しているかどうかチェック */
- if (on_pcm8() && (i = on_zmusic()) && i < 0x200) {
- w_open();
- w_mes(0, "PCM8とZMUSIC(v2.00未満)が同時に常駐しています");
- w_mes(2, "ハードコピーによる印刷はできません");
- w_wait(0);
- w_close();
- return;
- } else if (killed_trap12()) {
- w_open();
- w_mes(0, "HARD COPY割込み(TRAP 12)が無効にされています");
- w_mes(2, "ハードコピーによる印刷はできません");
- w_wait(0);
- w_close();
- return;
- }
-
- PM_X = CWIDTH - 64;
- PM_Y = 15;
-
- msarea((PM_X + 1) * 8, (PM_Y + 3) * 16 + 8, (PM_X + 62) * 8, 511);
- B_COLOR(5);
- win_frame(PM_X, PM_Y, PM_X + 62, PM_Y + 15, PM_Y + 3, menu_sx - 1);
- B_COLOR(3);
-
- B_LOCATE(PM_X + 3, PM_Y + 1);
- B_PRINT("◆◇◆ ハードコピーを利用してプリンタに出力します ◆◇◆");
- B_LOCATE(PM_X + 13, PM_Y + 2);
- B_PRINT("印刷中に[ESC]を押すと中止できます");
- for (i = 0; *(items[i].item); i++) {
- B_LOCATE(PM_X + items[i].ox, PM_Y + items[i].oy);
- B_PRINT(items[i].item);
- }
- B_LOCATE(PM_X + 3, PM_Y + 5);
- B_PRINT("印字サイズ :");
- B_LOCATE(PM_X + 3, PM_Y + 7);
- B_PRINT("1頁何画面 :");
- B_LOCATE(PM_X + 3, PM_Y + 9);
- B_PRINT("印字開始頁 :");
- B_LOCATE(PM_X + 3, PM_Y + 11);
- B_PRINT("紙送りモード:");
-
- item_rev(items, H_size, H_size);
- item_rev(items, Gamen, Gamen);
- item_rev(items, Iti, Iti);
- item_rev(items, Koukan, Koukan);
-
- wait_mb_off();
-
- while (!cansel) {
-
- do {
- p_time(0);
- dmspos(&px, &py); /* ver2.3で追加 */
- dmsstat(&dmx, &dmy, &bl, &br); /* ver2.3で追加 */
- } while (!bl && !br);
-
- if (br) { /* 右ボタンでescape */
- cansel = TRUE;
- break;
- }
- wait_mb_off();
- dmspos(&px, &py); /* ver2.3で追加 */
- px = px / 8 - PM_X;
- py = py / 16 - PM_Y;
- if (px >= 17) {
- if (py == 5) {
- old = H_size;
- if (px < 27) {
- H_size = 0;
- } else if ((px >= 29) && (px < 39)) {
- H_size = 1;
- }
- item_rev(items, old, H_size);
- } else if (py == 7) {
- old = Gamen;
- i = (px - 17) / 2;
- switch (i) {
- case 0:
- Gamen = 2;
- break;
- case 2:
- Gamen = 3;
- break;
- case 4:
- Gamen = 4;
- break;
- case 6:
- Gamen = 5;
- break;
- case 8:
- Gamen = 6;
- break;
- case 10:
- Gamen = 7;
- break;
- case 11:
- Gamen = 7;
- break;
- }
- item_rev(items, old, Gamen);
- } else if (py == 9) {
- old = Iti;
- if (px < 25) {
- Iti = 8;
- }
- if ((px >= 27) && (px < 51)) {
- Iti = 9;
- }
- item_rev(items, old, Iti);
- } else if (py == 11) {
- old = Koukan;
- if (px < 25) {
- Koukan = 10;
- }
- if ((px >= 27) && (px < 35)) {
- Koukan = 11;
- }
- if ((px >= 37) && (px < 59)) {
- Koukan = 12;
- }
- item_rev(items, old, Koukan);
- } else if (py == 13) {
- if (px < 25) {
- if ((rtn = printer_init()) == 0) {
- w_open();
- w_mes(0, "プリンタへの出力ができません!");
- w_wait(0);
- p_scr();
- } else {
- d_print2(H_size, Gamen, Iti, Koukan);
- }
- end_sw = 0;
- cansel = TRUE;
- }
- if ((px >= 35) && (px < 45)) {
- cansel = TRUE;
- }
- }
- }
- }
- if (end_sw) {
- for (i = 29; i >= (PM_Y - 1); i--) {
- p_lin(lp + i, i);
- }
- }
- msarea(0, 0, GWIDTH - 1, 511);
- wait_mb_off();
- }
-
-
- /*
- ハードコピーを使用した画面イメージ印字
- */
-
- static void
- d_print2(int p1, int p2, int p3, int p4)
- {
- int sw, i, j, k;
- int g_cnt;
-
- sw = 1;
- i = 0;
- j = 0;
- k = 0;
- g_cnt = 0; /* default(all page) */
- HCSIZE = p1;
-
- cutrev_Mode = TRUE;
-
- if ((p2 >= 2) && (p2 <= 6)) {
- g_cnt = p2 - 1;
- }
- if (p3 == 9) {
- i = lp;
- }
- dout();
- OS_CUROF();
- cls();
- while (sw) {
- if (esc_on()) {
- clr_kbf();
- j = 0;
- break;
- }
- clr_kbf();
- if ((j != 31) || (k != (g_cnt - 1)) || (!dinstr(lhp[i], LARGE_IDSTR))) {
- p_lin(i, j - 1);
- i++;
- }
- j++;
- if (((j) % 32) == 0) {
- j = 0;
- hcopy();
- cls();
- k++;
- }
- if ((g_cnt != 0) && (k >= g_cnt)) {
- k = 0;
- if (p4 == 10) {
- B_PRINT("\r\n\t\t紙を交換しましょう");
- B_PRINT("\r\n\r\n\tよろしかったら[Return/Enter]キーを押して下さい");
- B_PRINT("\r\n\r\n\t\t[ESC]キーで中止できます");
- while (1) {
- if (cr_on() || enter_on()) { /* ENTERでもOK */
- if (SNSPRN()){
- break;
- } else {
- cls();
- B_PRINT("\r\n\r\n\tプリンタを印刷可能状態にして下さい");
- B_PRINT("\r\n\r\n\tよろしかったら[return]キーを押して下さい");
- B_PRINT("\r\n\r\n\t\t[ESC]キーで中止できます");
- }
- }
- if (esc_on()) {
- sw = 0;
- break;
- }
- clr_kbf();
- }
- } else if (p4 == 12) {
- OUTPRN(12);
- }
- cls();
- }
- if (i >= lpmx) {
- break;
- }
- }
- if (j != 0) {
- hcopy();
- }
- cutrev_Mode = FALSE;
-
- cls();
- din(TRUE);
- p_scr();
- p_fpt(1);
- p_time(1);
- mouse(1);
- wait_mb_off();
- }
-
- static void
- hcopy(void)
- {
- asm("
- move.l _HCSIZE,d0
- trap #12
- ");
- }
-